/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package serv;

import aima.search.framework.HeuristicFunction;

/**
 *
 * @author Ferran
 */
public class FitxHeuristicFunction implements HeuristicFunction {

	@Override
	public double getHeuristicValue(Object o) {
		
		Estado state = (Estado) o;
		double diff_temps = Servi.lastState.temps - state.temps;
		double percentatgefitx;
		double percentatgeserv;
		double fservits = Servi.total_fitxers - state.trets.size();
		double euristic = 0.0;
		double eurtemps =  diff_temps;
		
		
                double k = 0.2;
				
				
		double tempmax = 0.0;
		for(int i = 0; i < state.tamTxServ; ++i){
			if(tempmax <= state.TxServer[i]) tempmax = state.TxServer[i];
		}


		double mitj = Servi.total_fitxers/Servi.maxServers;
		double dif = 0.0;
		for ( int i = 0 ; i < state.tamTxServ ; i ++ ) {
			double diflocal = mitj - state.TxServer[i];
			diflocal = diflocal*diflocal;
			dif = dif + diflocal;
		}
		dif = dif/state.tamTxServ;

		switch( Servi.esc ) {
			case retornatots:
				
				switch(Servi.cas){
					case cas1:
						euristic = tempmax;
						break;
					case cas2:
						euristic = tempmax + dif;
						break;
				}
				
				break;
				
			case noretornatots:

				if(fservits >= 0.7*Servi.total_fitxers){
					percentatgefitx = 0.3;
					percentatgeserv = 0.7;
				}
				else if (fservits < 0.7*Servi.total_fitxers && fservits >= 0.4*Servi.total_fitxers){
					percentatgefitx = 1-k;
					percentatgeserv = k;
				}

				else {
					percentatgefitx = 1;
					percentatgeserv = 0;
				}
				
				//percentatgefitx = 0.5;
				//percentatgeserv = 0.5;

				euristic = (tempmax+dif)*percentatgefitx + fservits * percentatgeserv;
                                
                //euristic = (tempmax+dif) + (k*state.trets.size());

				break;
                  
		}
				
		state.solucio = euristic;
		return euristic;
		
	}
    
}
